﻿using System;
using System.ComponentModel;
using System.Resources;

namespace Kyoh.Lib.Component.Globalization
{
    /// <summary>デザイナなどに表示するカテゴリ名をリソースから取得します。</summary>
    [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
    public sealed class CategoryFromResourceAttribute : CategoryAttribute
    {
        private ResourceManager resource;

        /// <summary><see cref="CategoryFromResourceAttribute"/> の新しいインスタンスを作成します。</summary>
        /// <param name="resourceSource">カテゴリ名を取得するリソースの型。</param>
        /// <param name="category">リソースからカテゴリ名を取得する際に使用する名前。</param>
        public CategoryFromResourceAttribute(Type resourceSource, string category)
            : base(category)
        {
            this.resource = new ResourceManager(resourceSource);
        }

        /// <summary>指定したカテゴリのローカライズされた名前を検索します。</summary>
        /// <param name="value">カテゴリ。</param>
        /// <returns>ローカライズされたカテゴリの名前。</returns>
        protected override string GetLocalizedString(string value)
        {
            try { return this.resource.GetString(base.Category); }
            catch { return base.Category; }
        }

        private Guid instanceGuid = Guid.NewGuid();
        /// <summary>この <see cref="Attribute"/> の一意の識別子を取得します。</summary>
        public override object TypeId { get { return instanceGuid; } }
    }
}
